package com.ssy.lingxi.message.im;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 腾讯云IM服务端API工具类
 * @author fhj
 * @date 2021/04/01
 * @version 2.0.0
 */
@Slf4j
public class ImServiceUtil {

    /**
     * 导入多个帐号
     * @param sdkAppId 创建应用时即时通信 IM 控制台分配的 SDKAppID
     * @param identifier 必须为 App 管理员帐号
     * @param key 创建应用时即时通信 IM 控制台分配的密钥
     * @param toAccount 需要查询的 UserID 的登录状态，一次最多查询500个 UserID 的状态
     * */
    public static JSONObject batchImport(Long sdkAppId, String identifier, String key, List<String> toAccount) {
        if(sdkAppId == null || StringUtils.isBlank(identifier) || StringUtils.isBlank(key) || CollectionUtil.isEmpty(toAccount)) {
            log.error("参数不能为空");
            return null;
        }

        StringBuilder url = new StringBuilder("https://console.tim.qq.com/v4/im_open_login_svc/multiaccount_import?");
        url.append("sdkappid=").append(sdkAppId);
        url.append("&identifier=").append(identifier);
        url.append("&usersig=").append(new TLSSigAPIv2(sdkAppId, key).genUserSig(identifier, 180 * 86400));
        url.append("&random=").append(Math.round(Math.random() * 99999999));
        url.append("&contenttype=").append("json");

        Map<String, List<String>> map = new HashMap<>();
        map.put("Accounts", toAccount);

        String result = HttpClientUtil.doPostJson(url.toString(), JSONUtil.toJsonStr(map));
        return JSONUtil.parseObj(result);
    }

    /**
     * 查询帐号
     * @param sdkAppId 创建应用时即时通信 IM 控制台分配的 SDKAppID
     * @param identifier 必须为 App 管理员帐号
     * @param key 创建应用时即时通信 IM 控制台分配的密钥
     * @param toAccount 单次请求最多支持100个帐号
     * */
    public static JSONObject query(Long sdkAppId, String identifier, String key, List<String> toAccount) {
        if(sdkAppId == null || StringUtils.isBlank(identifier) || StringUtils.isBlank(key) || CollectionUtil.isEmpty(toAccount)) {
            log.error("参数不能为空");
            return null;
        }

        StringBuilder url = new StringBuilder("https://console.tim.qq.com/v4/im_open_login_svc/account_check?");
        url.append("sdkappid=").append(sdkAppId);
        url.append("&identifier=").append(identifier);
        url.append("&usersig=").append(new TLSSigAPIv2(sdkAppId, key).genUserSig(identifier, 180 * 86400));
        url.append("&random=").append(Math.round(Math.random() * 99999999));
        url.append("&contenttype=").append("json");

        Map<String, Object> map = new HashMap<>();
        map.put("CheckItem", toAccount.stream().map(a -> {
            Map<String, String> userIdMap = new HashMap<>();
            userIdMap.put("UserID", a);
            return userIdMap;
        }).collect(Collectors.toList()));

        String result = HttpClientUtil.doPostJson(url.toString(), JSONUtil.toJsonStr(map));
        return JSONUtil.parseObj(result);
    }

    /**
     * 查询帐号在线状态
     * @param sdkAppId 创建应用时即时通信 IM 控制台分配的 SDKAppID
     * @param identifier 必须为 App 管理员帐号
     * @param key 创建应用时即时通信 IM 控制台分配的密钥
     * @param toAccount 需要查询的 UserID 的登录状态，一次最多查询500个 UserID 的状态
     * */
    public static JSONObject queryState(Long sdkAppId, String identifier, String key, List<String> toAccount) {
        if(sdkAppId == null || StringUtils.isBlank(identifier) || StringUtils.isBlank(key) || CollectionUtil.isEmpty(toAccount)) {
            log.error("参数不能为空");
            return null;
        }

        StringBuilder url = new StringBuilder("https://console.tim.qq.com/v4/openim/querystate?");
        url.append("sdkappid=").append(sdkAppId);
        url.append("&identifier=").append(identifier);
        url.append("&usersig=").append(new TLSSigAPIv2(sdkAppId, key).genUserSig(identifier, 180 * 86400));
        url.append("&random=").append(Math.round(Math.random() * 99999999));
        url.append("&contenttype=").append("json");

        Map<String, List<String>> map = new HashMap<>();
        map.put("To_Account", toAccount);

        String result = HttpClientUtil.doPostJson(url.toString(), JSONUtil.toJsonStr(map));
        return JSONUtil.parseObj(result);
    }

    /**
     * 单发单聊消息
     * @param sdkAppId 创建应用时即时通信 IM 控制台分配的 SDKAppID
     * @param identifier 必须为 App 管理员帐号
     * @param key 创建应用时即时通信 IM 控制台分配的密钥
     * @param fromAccount 发送方
     * @param toAccount 接收方
     * @param fromMemberId 发送方会员ID
     * @param toMemberId 接收方会员ID
     * */
    public static JSONObject sendMsg(Long sdkAppId, String identifier, String key, String fromAccount, String toAccount, Long fromMemberId, Long toMemberId) {
        if(sdkAppId == null || StringUtils.isBlank(identifier) || StringUtils.isBlank(key) || StringUtils.isBlank(fromAccount) || StringUtils.isBlank(toAccount)) {
            log.error("参数不能为空");
            return null;
        }

        StringBuilder url = new StringBuilder("https://console.tim.qq.com/v4/openim/sendmsg?");
        url.append("sdkappid=").append(sdkAppId);
        url.append("&identifier=").append(identifier);
        url.append("&usersig=").append(new TLSSigAPIv2(sdkAppId, key).genUserSig(identifier, 180 * 86400));
        url.append("&random=").append(Math.round(Math.random() * 99999999));
        url.append("&contenttype=").append("json");

        Map<String, Object> map = new HashMap<>();
        map.put("SyncOtherMachine", 1);
        map.put("From_Account", fromAccount);
        map.put("To_Account", toAccount);
        map.put("MsgRandom", Math.round(Math.random() * 999999));
        map.put("MsgTimeStamp", System.currentTimeMillis() / 1000);
        List<Map<String, Object>> msgBodyList = new ArrayList<>();
        Map<String, Object> msgBody = new HashMap<>();
        msgBody.put("MsgType", "TIMCustomElem");
        Map<String, Object> msgContent = new HashMap<>();
        msgContent.put("Data",  "{\"text\":\"你好\"}");
        msgContent.put("Ext",  "1");
        msgContent.put("Desc",  "{\"fromMemberId\":\""+fromMemberId+"\", \"toMemberId\":\""+toMemberId+"\"}");
        msgBody.put("MsgContent", msgContent);
        msgBodyList.add(msgBody);
        map.put("MsgBody", msgBodyList);

        String result = HttpClientUtil.doPostJson(url.toString(), JSONUtil.toJsonStr(map));
        return JSONUtil.parseObj(result);
    }
}


